#!/usr/bin/env python


from __future__ import print_function, unicode_literals

import argparse
import sys


DESCRIPTION = """
This is a simple script that takes input from stdin and prints out any lines that are
greater than 80+ characters. In such a case, it will print out the line number, the
length of the line, and the line with whitespace stripped. The reason why we print out
the line with whitespace stripped is that in the case where there is a lot of redundant
whitespace, the output becomes hard to read and no value is provided in terms of finding
the line in question. Exits with 1 if it finds any violating lines, 0 otherwise.
"""


def parse_args():
    parser = argparse.ArgumentParser(description=DESCRIPTION)

    parser.add_argument(
        "infile",
        nargs="?",
        type=argparse.FileType("r"),
        default=sys.stdin,
        help="The file to read input from. If no file is provided, stdin is used.",
    )
    parser.add_argument(
        "-o",
        "--output",
        type=argparse.FileType("w"),
        default=sys.stdout,
        help="The file to print to. If no file is provided, stdout is used",
        dest="outfile",
    )
    parser.add_argument(
        "--max-length",
        type=int,
        default=80,
        metavar="LENGTH",
        help="Maximum line length that the script should check for",
    )
    parser.add_argument(
        "--count-newline",
        action="store_false",
        help="Should we include the newline in our line length count",
    )

    return parser.parse_args()


def main():
    args = parse_args()

    found_violation = False

    for lineno, line in enumerate(args.infile, start=1):
        # sys.stdin.readlines() includes a newline. So we subtract 1 from our length to
        # get the "true" line length.
        length = len(line) - int(args.count_newline)
        if length > args.max_length:
            found_violation = True
            print(
                "line: {}. length: {}: {}".format(lineno, length, line.strip()),
                file=args.outfile,
            )

    sys.exit(found_violation)


if __name__ == "__main__":
    sys.exit(main())
